package com.bipbip.repositorio;

import com.bipbip.modelo.Publicacion;
import com.bipbip.modelo.Suscripcion;
import com.bipbip.modelo.Usuario;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Repository(value = "suscripcionDao")
@Transactional(readOnly = true)
public class JPASuscripcionDAOImpl implements SuscripcionDAO {

    private EntityManager em = null;

    /*
     * Sets the entity manager.
     */
    @PersistenceContext
    public void setEntityManager(EntityManager em) {
        this.em = em;
    }

    @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
    public Suscripcion insert(Suscripcion suscripcion) {
        em.persist(suscripcion);
        return suscripcion;
    }

    public List<Suscripcion> selectAll() {
        return em.createQuery("select s from Suscripcion s where isDeleted=0").getResultList();
    }

    public Suscripcion select(int id) {
        return em.find(Suscripcion.class, id);
    }

    @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
    public void delete(Suscripcion s) {
    	s.setDeleted(true);
    	update(s);
    }

    @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
    public Suscripcion update(Suscripcion s) {
        return em.merge(s);
    }

    public List<Suscripcion> selectByUsuario(Usuario usuario) {
        return selectByIdUsuario(usuario.getId());
    }

    public List<Suscripcion> selectByIdUsuario(int idUsuario) {
        Query query = em.createQuery("select s from Suscripcion s where isDeleted=0 and Usuario_id = "
                + idUsuario);
        return query.getResultList();
    }

    public List<Suscripcion> selectByPublicacion(Publicacion publicacion) {
        return selectByIdPublicacion(publicacion.getId());
    }

    public List<Suscripcion> selectByIdPublicacion(int idPublicacion) {
        Query query = em.createQuery("select s from Suscripcion s where isDeleted=0 and Publicacion_id = "
                + idPublicacion);
        return query.getResultList();
    }

}
